const app = getApp();
const { request } = require('../../../utils/request');
const api = require('../../../utils/api.js');
const codeApi = require('../../../utils/codeApi.js');

// 引入wxCharts图表库（需提前在项目中引入）
// 如果没有引入，则需在app.json中配置或加载JS文件
let wxCharts = require('../../../utils/wxcharts.js');
// 如果上面的引入方式出错，可以尝试使用下面的方式
// try {
//   wxCharts = require('../../../utils/wxcharts.js');
// } catch (e) {
//   console.error('未找到图表库，请确保已引入wxcharts.js');
// }

let salesChart = null;
let pieChart = null; // 饼图实例
let windowWidth = 320;

Page({
  /**
   * 页面的初始数据
   */
  data: {
    loading: true,
    agentInfo: null,
    
    // 统计周期
    dateRanges: [
      { value: 'week', label: '最近7天' },
      { value: 'month', label: '最近30天' },
      { value: 'year', label: '最近12个月' }
    ],
    currentRange: 'week',
    
    // 统计维度
    dimensions: [
      { value: 'day', label: '按日统计' },
      { value: 'week', label: '按周统计' },
      { value: 'month', label: '按月统计' }
    ],
    currentDimension: 'day',
    
    // 销售数据
    salesData: {
      total: 0,
      average: 0,
      max: 0,
      min: 0,
      chartData: []
    },
    
    // 饼图数据
    pieData: [
      { name: '已售卖', data: 0, color: '#1989fa' },
      { name: '未售卖', data: 0, color: '#ff9800' }
    ],
    
    // 同比环比
    compareData: {
      same_period: { value: 0, rate: 0 },
      previous_period: { value: 0, rate: 0 }
    },
    
    // 销售明细
    salesList: [],
    
    // 分页相关
    pageSize: 10,
    currentPage: 1,
    hasMore: false,
    totalItems: 0,
    
    // 卡密明细选项卡
    codesTabs: [
      { id: 'all', name: '全部' },
      { id: 'sold', name: '已售卖' },
      { id: 'unsold', name: '未售卖' }
    ],
    currentCodeTab: 'all',
    
    // 卡密列表
    codesList: [],
    
    // 自定义日期
    showDatePicker: false,
    startDate: '',
    endDate: '',
    minDate: '',
    maxDate: '',
    
    // 当前显示模式
    showMode: 'chart' // chart-图表, table-卡密明细
  },

  /**
   * 生命周期函数--监听页面加载
   */
  onLoad: function (options) {
    // 获取屏幕宽度用于绘制图表
    try {
      const res = wx.getSystemInfoSync();
      windowWidth = res.windowWidth;
    } catch (e) {
      console.error('获取系统信息失败', e);
    }
    
    // 设置日期范围（最大可查询过去一年）
    const today = new Date();
    const maxDate = today.toISOString().split('T')[0];
    
    const minDateObj = new Date();
    minDateObj.setFullYear(today.getFullYear() - 1);
    const minDate = minDateObj.toISOString().split('T')[0];
    
    this.setData({
      maxDate: maxDate,
      minDate: minDate,
      endDate: maxDate,
      
      // 默认开始日期为7天前
      startDate: new Date(today.setDate(today.getDate() - 7)).toISOString().split('T')[0]
    });
    
    // 检查代理权限
    this.checkAgentPermission();
  },

  /**
   * 检查代理权限
   */
  checkAgentPermission() {
    const userId = wx.getStorageSync('userId');
    
    if (!userId) {
      wx.showModal({
        title: '提示',
        content: '未登录或登录已过期，请先登录',
        showCancel: false,
        success: () => {
          wx.navigateTo({
            url: '/pages/login/login'
          });
        }
      });
      return;
    }
    
    codeApi.checkPermission(userId)
    .then(res => {
      if (res.code === 0 && res.data && res.data.has_permission) {
        this.setData({
          agentInfo: res.data.agent_info || {}
        });
        
        // 获取销售统计
        this.fetchSalesStats();
        
        // 获取卡密统计数据（用于饼图）
        this.fetchCodesStatistics();
      } else {
        wx.showModal({
          title: '提示',
          content: '您暂无代理管理权限',
          showCancel: false,
          success: () => {
            wx.navigateBack();
          }
        });
      }
    })
    .catch(err => {
      console.error('检查权限失败', err);
      
      wx.showToast({
        title: '网络错误',
        icon: 'none',
        success: () => {
          setTimeout(() => {
            wx.navigateBack();
          }, 1500);
        }
      });
    });
  },

  /**
   * 获取销售统计数据
   */
  fetchSalesStats() {
    const { agentInfo, currentRange, currentDimension, startDate, endDate } = this.data;
    
    if (!agentInfo || !agentInfo.id) {
      this.setData({ loading: false });
      return;
    }
    
    this.setData({ loading: true });
    
    // 构建参数
    const params = {
      agent_id: agentInfo.id,
      dimension: currentDimension,
    };
    
    // 根据是预设范围还是自定义范围设置不同参数
    if (currentRange === 'custom') {
      params.startDate = startDate;
      params.endDate = endDate;
    } else {
      params.range = currentRange;
    }
    
    request(api.agent_sales_stats, 'GET', params)
    .then(res => {
      if (res.code === 0 && res.data) {
        // 处理图表数据
        const chartData = this.formatChartData(res.data.chartData || []);
        
        this.setData({
          salesData: {
            total: res.data.total || 0,
            average: res.data.average || 0,
            max: res.data.max || 0,
            min: res.data.min || 0,
            chartData: chartData
          },
          compareData: {
            same_period: res.data.compare?.same_period || { value: 0, rate: 0 },
            previous_period: res.data.compare?.previous_period || { value: 0, rate: 0 }
          },
          loading: false
        });
        
        // 绘制销售趋势图表
        this.drawSalesChart();
        
        // 获取销售明细
        this.fetchSalesList(true);
      } else {
        this.setData({ loading: false });
        wx.showToast({
          title: res.message || '获取销售统计失败',
          icon: 'none'
        });
      }
    })
    .catch(err => {
      console.error('获取销售统计失败', err);
      this.setData({ loading: false });
      wx.showToast({
        title: '网络错误',
        icon: 'none'
      });
    });
  },
  
  /**
   * 获取卡密统计数据（用于饼图）
   */
  fetchCodesStatistics() {
    const { agentInfo } = this.data;
    
    if (!agentInfo || !agentInfo.id) return;
    
    codeApi.getCodesStatistics(agentInfo.id)
    .then(res => {
      if (res.code === 0 && res.data) {
        // 使用卡密统计数据设置饼图数据
        const usedCount = res.data.used_count || 0;
        const unusedCount = res.data.unused_count || 0;
        
        this.setData({
          pieData: [
            { name: '已售卖', data: usedCount, color: '#1989fa' },
            { name: '未售卖', data: unusedCount, color: '#ff9800' }
          ]
        });
        
        // 绘制饼图
        this.drawPieChart();
      }
    })
    .catch(err => {
      console.error('获取卡密统计失败', err);
    });
  },

  /**
   * 获取销售明细
   */
  fetchSalesList(refresh = true) {
    const { agentInfo, currentPage, pageSize, startDate, endDate, currentCodeTab, showMode } = this.data;
    
    if (!agentInfo || !agentInfo.id) return;
    
    // 如果正在显示卡密明细，则加载卡密数据
    if (showMode === 'table') {
      return this.fetchCodesList(refresh);
    }
    
    // 构建查询参数
    const params = {
      agent_id: agentInfo.id,
      page: refresh ? 1 : currentPage,
      page_size: pageSize,
      startDate: startDate,
      endDate: endDate
    };
    
    request(api.agent_sales_detail, 'GET', params)
    .then(res => {
      if (res.code === 0 && res.data) {
        const newList = res.data.list || [];
        const total = res.data.total || 0;
        
        this.setData({
          salesList: refresh ? newList : [...this.data.salesList, ...newList],
          currentPage: refresh ? 1 : this.data.currentPage,
          hasMore: (refresh ? 1 : this.data.currentPage) * pageSize < total,
          totalItems: total,
          loading: false
        });
      } else {
        this.setData({ loading: false });
        wx.showToast({
          title: res.message || '获取销售明细失败',
          icon: 'none'
        });
      }
    })
    .catch(err => {
      console.error('获取销售明细失败', err);
      this.setData({ loading: false });
    });
  },
  
  /**
   * 获取卡密列表明细
   */
  fetchCodesList(refresh = true) {
    const { agentInfo, currentPage, pageSize, startDate, endDate, currentCodeTab } = this.data;
    
    if (!agentInfo || !agentInfo.id) return;
    
    // 构建查询参数
    const params = {
      agent_id: agentInfo.id,
      page: refresh ? 1 : currentPage,
      page_size: pageSize,
      startDate: startDate,
      endDate: endDate,
      status: currentCodeTab
    };
    
    this.setData({ loading: true });
    
    request(api.agent_sales_detail, 'GET', params)
    .then(res => {
      if (res.code === 0 && res.data) {
        const newList = res.data.list || [];
        const total = res.data.total || 0;
        
        this.setData({
          codesList: refresh ? newList : [...this.data.codesList, ...newList],
          currentPage: refresh ? 1 : this.data.currentPage,
          hasMore: (refresh ? 1 : this.data.currentPage) * pageSize < total,
          totalItems: total,
          loading: false
        });
      } else {
        this.setData({ loading: false });
        wx.showToast({
          title: res.message || '获取卡密明细失败',
          icon: 'none'
        });
      }
    })
    .catch(err => {
      console.error('获取卡密明细失败', err);
      this.setData({ loading: false });
    });
  },

  /**
   * 格式化图表数据
   */
  formatChartData(data) {
    // 返回一个适合绘图的数据格式
    return data.map(item => {
      return {
        date: item.date,
        value: item.value
      };
    });
  },

  /**
   * 绘制销售趋势图表
   */
  drawSalesChart() {
    const { salesData } = this.data;
    
    if (!salesData || !salesData.chartData || salesData.chartData.length === 0) {
      console.warn('没有销售数据用于绘制图表');
      return;
    }
    
    // 准备图表数据
    const categories = salesData.chartData.map(item => item.date);
    const series = [{
      name: '销售趋势',
      data: salesData.chartData.map(item => item.value),
      format: function (val) {
        return val.toFixed(0);
      }
    }];
    
    // 销毁旧图表实例（如果存在）
    if (salesChart) {
      // 在有些wxCharts版本中可能需要手动销毁
      try {
        salesChart.destroy && salesChart.destroy();
      } catch (e) {
        console.error('销毁旧图表实例失败', e);
      }
    }
    
    // 创建新图表
    try {
      salesChart = new wxCharts({
        canvasId: 'salesCanvas',
        type: 'line',
        categories: categories,
        animation: true,
        series: series,
        xAxis: {
          disableGrid: true,
          fontColor: '#7F7F7F'
        },
        yAxis: {
          title: '销售量',
          format: function (val) {
            return val.toFixed(0);
          },
          min: 0
        },
        width: windowWidth,
        height: 200,
        dataLabel: false,
        dataPointShape: true,
        extra: {
          lineStyle: 'curve'
        }
      });
    } catch (e) {
      console.error('绘制销售趋势图表失败', e);
    }
  },

  /**
   * 绘制饼图
   */
  drawPieChart() {
    const { pieData } = this.data;
    
    // 确保有数据可供绘制
    if (!pieData || pieData.length === 0) {
      console.warn('没有饼图数据');
      return;
    }
    
    // 销毁旧图表（如果存在）
    if (pieChart) {
      try {
        pieChart.destroy && pieChart.destroy();
      } catch (e) {
        console.error('销毁旧饼图实例失败', e);
      }
    }
    
    // 准备饼图数据
    const series = pieData.map(item => {
      return {
        name: item.name,
        data: item.data,
        color: item.color
      };
    });
    
    // 绘制饼图
    try {
      pieChart = new wxCharts({
        canvasId: 'pieCanvas',
        type: 'pie',
        series: series,
        width: windowWidth,
        height: 300,
        dataLabel: true
      });
    } catch (e) {
      console.error('绘制饼图失败', e);
    }
  },

  /**
   * 切换统计周期
   */
  changeRange(e) {
    const range = e.currentTarget.dataset.range;
    
    this.setData({
      currentRange: range
    });
    
    // 重新加载数据
    this.fetchSalesStats();
  },

  /**
   * 切换统计维度
   */
  changeDimension(e) {
    const dimension = e.currentTarget.dataset.dimension;
    
    this.setData({
      currentDimension: dimension
    });
    
    // 重新加载数据
    this.fetchSalesStats();
  },
  
  /**
   * 切换卡密选项卡
   */
  changeCodeTab(e) {
    const tabId = e.currentTarget.dataset.id;
    
    this.setData({
      currentCodeTab: tabId
    });
    
    // 重新加载卡密数据
    this.fetchCodesList(true);
  },
  
  /**
   * 切换显示模式（图表/卡密明细）
   */
  switchMode(e) {
    const mode = e.currentTarget.dataset.mode;
    
    this.setData({
      showMode: mode
    });
    
    // 根据模式加载不同数据
    if (mode === 'chart') {
      this.fetchSalesStats();
    } else {
      this.fetchCodesList(true);
    }
  },

  /**
   * 显示日期选择器
   */
  showDatePicker() {
    this.setData({
      showDatePicker: true
    });
  },

  /**
   * 隐藏日期选择器
   */
  hideDatePicker() {
    this.setData({
      showDatePicker: false
    });
  },

  /**
   * 确认日期选择
   */
  confirmDateRange() {
    this.setData({
      currentRange: 'custom',
      showDatePicker: false
    });
    
    // 重新加载数据
    this.fetchSalesStats();
  },

  /**
   * 修改开始日期
   */
  bindStartDateChange(e) {
    this.setData({
      startDate: e.detail.value
    });
  },

  /**
   * 修改结束日期
   */
  bindEndDateChange(e) {
    this.setData({
      endDate: e.detail.value
    });
  },

  /**
   * 加载更多数据
   */
  loadMore() {
    if (!this.data.hasMore || this.data.loading) return;
    
    this.setData({
      currentPage: this.data.currentPage + 1,
      loading: true
    });
    
    // 判断当前模式，加载相应数据
    if (this.data.showMode === 'table') {
      this.fetchCodesList(false);
    } else {
      this.fetchSalesList(false);
    }
  },

  /**
   * 下拉刷新
   */
  onPullDownRefresh() {
    // // 重新加载数据
    // if (this.data.showMode === 'chart') {
    //   this.fetchSalesStats();
    //   this.fetchCodesStatistics();
    // } else {
    //   this.fetchCodesList(true);
    // }
    
    // // 完成后停止下拉刷新
    // wx.stopPullDownRefresh();
    return
  },

  /**
   * 页面上拉触底事件的处理函数
   */
  onReachBottom() {
    // this.loadMore();
    return
  }
}); 